export default function (Vue) {
  // $eventDispatch和 $eventBroadcast 都是 vue 1.0 版本的内置方法且已经废弃

  /**
   * 触发事件
   * @param {*} name
   * @param {*} value
   * @description
   * 这个方法是从子组件往上一层一层遍历去触发事件，从而达到跨组件通讯的目的
   */
  Vue.prototype.$eventDispatch = function (name, value) {
    // this 是谁调用，就指向当前组件实例

    let parent = this.$parent

    while (parent) {
      parent.$emit(name, value)

      // 继续往上找 parent, 直到没有 parent 为止，即parent = undefined, 其实最后一层是 #app vue根实例
      parent = parent.$parent
    }
  }

  /**
   * 广播事件
   * @param {*} name
   * @param {*} value
   * @description
   * 从上往下一层一层找子组件的实例， 然后调用对应的方法
   */
  Vue.prototype.$eventBroadcast = function (name, value) {

    /**
     * 递归
     * @param {*} children 当前实例的子组件， 一个父组件可能有「多个」子组件，都要将事件广播到
     */
    let cb = (children) => {
      children.map(c => {
        // c是子组件实例
        c.$emit(name, value)

        if (c.$children) {
          cb(c.$children)
        }
      })
    }

    cb(this.$children)
  }

  /**
   * 挂载eventBus
   * 利用的就是实例上的 $on 和 $emit 方法
   */
  Vue.prototype.$eventBus = new Vue()
}
